package com.cloudfun.campusshare.service;

import com.cloudfun.campusshare.common.constant.OrderStatus;
import com.cloudfun.campusshare.common.constant.ProductType;
import com.cloudfun.campusshare.common.model.dto.BasePayDTO;
import com.cloudfun.campusshare.common.model.dto.TradePreCreateRespDTO;
import com.cloudfun.campusshare.common.model.dto.WeChatNotifyRespDTO;
import com.cloudfun.campusshare.common.model.dto.WeChatPaymentNotifyDTO;
import com.cloudfun.campusshare.common.model.dto.kjt.KjtPaymentNotifyDTO;
import com.cloudfun.campusshare.common.model.vo.*;
import com.cloudfun.campusshare.common.response.BaseResult;
import com.cloudfun.campusshare.common.response.PageResult;
import com.cloudfun.campusshare.entity.DeviceEntity;
import com.cloudfun.campusshare.entity.OrderEntity;
import org.springframework.data.domain.Pageable;

import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created by Huqin on 2019/12/11
 */
public interface DeviceOrderService {

    /**
     * 创建
     *
     * @param deviceOrderVO
     * @return
     */
    BaseResult create(DeviceOrderVO deviceOrderVO);

    /**
     * 查询订单总额
     *
     * @param userId
     * @return
     */
    String orderTotal(String userId);

    /**
     * 本月订单总额
     *
     * @return
     */
    String currMonthOrderTotal();

    /**
     * 用户id和订单总额map
     *
     * @param projectIds
     * @return
     */
    Map<String, String> getUserIdOrderTotalMap(Collection<String> projectIds);

    /**
     * 分页查询项目关联的设备订单
     *
     * @param projectId
     * @param pageable
     * @return
     */
    PageResult<ProjectDeviceOrderListVO> searchProjectDeviceOrders(String projectId, Pageable pageable);

    /**
     * 导出查询项目关联的设备订单
     *
     * @param projectId
     * @return
     */
    List<ProjectDeviceOrderExportVO> exportProjectDeviceOrders(String projectId);


    /**
     * 查询订单列表
     *
     * @param pageable
     * @param startTime
     * @param endTime
     * @param keyword
     * @param projectId
     * @return
     */
    PageResult<OrderListVO> queryDeviceOrderList(Pageable pageable, String startTime, String endTime, String keyword, String deviceType,
                                                 OrderStatus orderStatus, String projectId);

    /**
     * 查询顾客使用记录
     *
     * @return
     */
    PageResult<UseOrderListVO> searchUserOrder(Pageable pageable);


    /**
     * 使用记录详情
     *
     * @param orderId
     * @return
     */
    UseOrderDetailVO queryUseDetail(String orderId);


    /**
     * 用户正在进行中的订单查询
     *
     * @param pageable
     * @return
     */
    PageResult queryExecutingOrderList(Pageable pageable);

    /**
     * 设备是否可用
     * 会检查设备状态、设备锁和设备运行状态
     *
     * @param deviceEntity
     */
    BaseResult<?> deviceAvailable(DeviceEntity deviceEntity );

    /**
     * 订单生成
     *
     * @param orderGenerateVO
     */
    Map<String, Object> generateOrder(OrderGenerateVO orderGenerateVO);

    /**
     * 用户放弃支付订单
     *
     * @param orderId
     */
    void giveUpOrder(String orderId);


    /**
     * 订单支付
     *
     * @param orderPayVO
     */
    Map<String, Object> payOrder(OrderPayVO orderPayVO);


    /**
     * 快捷通 聚合扫码支付
     * H5页面订单支付
     *
     * @param orderPayVO
     */
    BasePayDTO payOrder4H5(OrderPayVO orderPayVO);

    /**
     * H5页面订单支付
     *
     * @param h5OrderPayVO
     */
//    TradePreCreateRespDTO payOrder4H5(H5OrderPayVO h5OrderPayVO);

    void handlePaySuccess(OrderEntity orderEntity, LocalDateTime paymentEndTime);

    /**
     * 创建账单
     * @param orderEntity
     * @param paymentNotifyDTO
     */
    public void createBill(OrderEntity orderEntity, Object paymentNotifyDTO);
    /**
     * 支付回调
     *
     * @param paymentNotifyDTO
     * @return
     */
    WeChatNotifyRespDTO paymentNotify(WeChatPaymentNotifyDTO paymentNotifyDTO);

    /**
     * 快捷通支付回调
     *
     * @param paymentNotifyDTO
     * @return
     */
    boolean paymentNotify(KjtPaymentNotifyDTO paymentNotifyDTO);

    /**
     * 转换或者释放锁
     *
     * @param deviceId
     */
    void transferOrReleaseDeviceLock(String deviceId);

    /**
     * 设备停止
     *
     * @param deviceId
     */
    void onDeviceStop(String deviceId);

    /**
     * 启动设备
     *
     * @param orderId
     */
    BaseResult<?> startDevice(String orderId);

    /**
     * 根据订单启动设备
     *
     * @param orderEntity
     */
    BaseResult<?> startDevice(OrderEntity orderEntity);

    /**
     * 根据订单获取设备状态信息
     *
     * @param orderId
     * @return
     */
    DeviceStateInfoVO getDeviceState(String orderId);

    /**
     * 手动完成订单
     *
     * @param orderId
     * @return
     */
    BaseResult<?> manualComplete(String orderId);

    /**
     * 运营商营收统计
     *
     * @param preferWashPointId
     * @return
     */
    OMRevenueStatisticsVO omRevenueStatisticsVO(String preferWashPointId);

    /**
     * 运营平台查询订单列表
     *
     * @param keyword
     * @param status
     * @param type
     * @param startTime
     * @param endTime
     * @return
     */
    PageResult queryListForOperPlat(Pageable pageable, String keyword, Set<OrderStatus> status, Set<ProductType> type,
                                    String startTime, String endTime);

    /**
     * 运营平台导出订单
     *
     * @param ids
     * @param keyword
     * @param status
     * @param productType
     * @param startTime
     * @param endTime
     * @return
     */
    List<ExportOrderForOperVO> exportForOperPlat(Set<String> ids, String keyword, Set<OrderStatus> status, Set<ProductType> productType,
                                                 String startTime, String endTime, String all);

    /**
     * 订单支付后筒自洁
     *
     * @param orderId
     * @return
     */
    BaseResult<?> deviceSelfClean(String orderId);

    /**
     * 预约空闲设备
     *
     * @param orderGenerateVO
     * @return
     */
    SubscribeDeviceReVO subscribeIdleDevice(OrderGenerateVO orderGenerateVO);


    /**
     * 用户加入预约队列
     *
     * @param orderGenerateVO
     * @return
     */
    SubscribeDeviceReVO userJoinQueue(OrderGenerateVO orderGenerateVO);

    /**
     * 用户取消订单
     *
     * @param orderId
     */
    void userCancelSubscribe(String orderId);

    /**
     * 获取用户洗衣点设备列表
     *
     * @param washPointId
     * @return
     */
    List<UserPickDeviceVO> getUserPickDeviceList(String washPointId,ProductType productType);

    /**
     * 获取未支付订单剩余时间
     *
     * @param orderId
     * @return
     */
    Long getOrderPayLeftTime(String orderId);

    /**
     * 获取用户选择剩余时间
     *
     * @param orderId
     * @return
     */
    Long getUserChoiceLeftTime(String orderId);

    /**
     * 获取用户预约剩余时间
     *
     * @param orderId
     * @return
     */
    Long getUserSubscribeLeftTime(String orderId);

    /**
     * 首页跳转订单查询
     *
     * @param deviceId
     * @param status
     * @return
     */
    List<OrderEntity> queryForScanSkip(String deviceId, OrderStatus status);


    /**
     * 获取设备排队信息
     * @param deviceId
     * @return
     */
    UserWaitQueue getUserWaitQueueInfo(String deviceId,Boolean isAfterSubscribe);

    OrderEntity refund(String orderId);

    /**
     * 统计订单金额
     * @param pageable
     * @param startTime
     * @param endTime
     * @param keyword
     * @param deviceType
     * @param orderStatusEnum
     * @param projectId
     * @return
     */
    double countOrderList(String keyword, Set<OrderStatus> status, Set<ProductType> productType, String startTime, String endTime);
}
